/**
 * @param {number[]} nums
 * @return {number}
 */
var longestConsecutive = function(nums) {
  const map = {}
  for(let n of nums) {
    // 当前数字所能到达的最远右边界
    map[n] = n
  }
  let ans = 0
  for(let n of nums) {
    if(map[n - 1] !== undefined) { // 没有当前节点更左边的左端点，说明当前是左端点
      let right = map[n]
      while(map[right + 1] !== undefined) {
        right = map[right + 1]
      }

      map[n] = right
      ans = Math.max(ans, right - n + 1)
    }
  }
  return ans
};
// 哈希表方法2
// 当前节点的序列长度等于左邻居的+1（自己）+右邻居
var longestConsecutive = (nums) => {
  const map = new Map()
  let max = 0
  for(let n of nums) {
    if(!map.has(n)) {  // 只计算不重复的数字
      let left = map.get(n - 1) || 0
      let right = map.get(n + 1) || 0
      let self = left + right + 1
      map.set(n, self)
      max = Math.max(max, self)
      // 更新序列左右端点
      map.set(n - left, self)
      map.set(n + right, self)
    }
  }
  return max
}